package cn.wolfcode.luowowo.web.interceptor;

import cn.wolfcode.luowowo.annotion.RequireLogin;
import cn.wolfcode.luowowo.cache.service.IUserInfoRedisService;
import cn.wolfcode.luowowo.domain.UserInfo;
import cn.wolfcode.luowowo.util.JsonResult;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 用户登录拦截
 */
public class CheckLoginInterceptor implements HandlerInterceptor{
    @Autowired
    private IUserInfoRedisService userInfoRedisService;
    //登录拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        //System.out.println(request.getRequestURL());
        //System.out.println(request.getMethod());
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        //handler请求映射方法的处理器
        //1.识别请求映射方法头顶是否贴@RequireLogin注解
        /**
         * 1:SpringMVC启动时候会将所有的请求映射方法解析.并封装成一个对象:HandlerMethod
         * 这个对象里面包含了请求映射方法所有信息: 包括映射方法上的注解
         * 2:SpringMVC定义一个类似map瑞祥管理所有请求映射方法对象
         *      map 的 key是请求映射方法的url路径,value就是请求映射方法对象
         * 3:浏览器发起请求时,输入url地址
         *      http://localhost:8080/user/getCuttentUser
         *      服务器解析url地址获取/user/getCountUser进而获取,该映射url对应映射方法对象:handlerMethod
         * 4:SpringMVC马上调用 CheckLoginInterceptor类对象,执行preHandler方法,参数是请求对象,响应对象,handlerMethod
         */
        //获取token
        String token = request.getHeader("token");
        //通过token获取当前登录用户
        //所有的访问如果有登录,那就都重置登录时间30分钟
        UserInfo userInfo = userInfoRedisService.getUserByToken(token);
        HandlerMethod hm = (HandlerMethod) handler;
        if (hm.hasMethodAnnotation(RequireLogin.class)) {
            //2.如果贴了,则进行登录校验
            //判断有没有获取到当前用户以此来判断是否登录
            if (userInfo == null) {
                response.setContentType("application/json;charset=UTF-8");
                response.getWriter().write(JSON.toJSONString(JsonResult.noLogin()));
                return false;
            }
        }
        //3.如果没贴,则直接放行
        return true;
    }
}
